package com.xaslsoft.xaslsoft.device.xunwei;

import cn.hutool.core.util.StrUtil;
import com.xaslsoft.xaslsoft.device.serial.modbus.CRCUtil;
import com.xaslsoft.xaslsoft.device.utils.ByteUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * 讯威DTU SRND-CM-IO44（24L/24H）
 * 黄伟
 */
public class XunWeiDTU {
	/**
	 * 继电器全开指令
	 */
	public static final String CMD_OPEN_ALL_RELAY = "010F0000000802FFFFE530";
	/**
	 * 继电器全关指令
	 */
	public static final String CMD_CLOSE_ALL_RELAY = "010F00000008020000E480";
	public static final Map<String, X03> X03_MAP = new HashMap();
	public static final Map<String, Y03> Y03_MAP = new HashMap();
	/**
	 * 继电器通讯协议格式
	 */
	private static final String CMD_RELAY_HEX = "010500{}{}00";
	/**
	 * 获取XY四路状态
	 */
	private static final String CMD_READ_X_Y_STATUS = "01{}00000004";
	/**
	 * 四路开关量帧头
	 */
	private static final String CMD_X14_HEADER = "010203";

	/**
	 * 读取XY状态指令
	 * 0x01 0x02 0x00 0x00 0x00 0x08 0x79 0xCC
	 * 0x01 0x01 0x00 0x00 0x00 0x08 0x3D 0xCC
	 */
	public static String CMD_RELAY_HEX(Relay relay, Status status) {
		String hex = StrUtil.format(CMD_RELAY_HEX, relay.hex, status.hex);
		return CRCUtil.hexCRC16(hex);
	}

	/**
	 * 读取XY状态指令
	 *
	 * @param xy
	 * @return
	 */
	public static String CMD_READ_X_Y_STATUS(XY xy) {
		String hex = StrUtil.format(CMD_READ_X_Y_STATUS, xy.hex);
		return CRCUtil.hexCRC16(hex);
	}

	public static X03 parseX03(String hex) {
		X03 x03 = new X03();
		if (hex.length() == 12 && hex.startsWith("0102")) {
			//X开关状态获取结果
			String status = StrUtil.sub(hex, 6, 8);
			String radix2 = ByteUtils.transRadix(status, 16, 2);
			String[] cut = StrUtil.cut(radix2, 1);

			x03.setX0("1".equals(cut[3]) ? true : false);
			x03.setX1("1".equals(cut[2]) ? true : false);
			x03.setX2("1".equals(cut[1]) ? true : false);
			x03.setX3("1".equals(cut[0]) ? true : false);
			System.out.println("x03==" + x03);
		}
		return x03;
	}

	public static X03 parseX1248(String hex, X03 x03) {
		if (hex.length() == 16 && hex.startsWith("010203")) {
			//X开关状态获取结果
			String status = StrUtil.sub(hex, 7, 8);
			x03.setX0("1".equals(status) ? true : false);
			x03.setX1("2".equals(status) ? true : false);
			x03.setX2("4".equals(status) ? true : false);
			x03.setX3("8".equals(status) ? true : false);
			System.out.println("x03==" + x03);
		}
		return x03;
	}

	public static Y03 parseY03(String hex) {
		Y03 y03 = new Y03();
		if (hex.length() == 12 && hex.startsWith("0101")) {
			//X开关状态获取结果
			String status = StrUtil.sub(hex, 6, 8);
			String radix2 = ByteUtils.transRadix(status, 16, 2);
			String[] cut = StrUtil.cut(radix2, 1);
			y03.setY0("1".equals(cut[3]) ? true : false);
			y03.setY1("1".equals(cut[2]) ? true : false);
			y03.setY2("1".equals(cut[1]) ? true : false);
			y03.setY3("1".equals(cut[0]) ? true : false);
			System.out.println("y03==" + y03);
		}
		return y03;
	}

	/**
	 * 继电器开关枚举
	 */
	public enum Relay {
		RELAY_1("00"),
		RELAY_2("01"),
		RELAY_3("02"),
		RELAY_4("03");
		private String hex;

		Relay(String hex) {
			this.hex = hex;
		}
	}

	/**
	 * 继电器状态枚举
	 */
	public enum Status {
		/**
		 * 状态开
		 */
		OPEN("FF"),
		/**
		 * 状态关
		 */
		CLOSE("00");
		private String hex;

		Status(String hex) {
			this.hex = hex;
		}
	}

	/**
	 * 读取XY状态枚举
	 */
	public enum XY {
		/**
		 * X开关量
		 */
		X("02"),
		/**
		 * Y开关量
		 */
		Y("01");
		private String hex;

		XY(String hex) {
			this.hex = hex;
		}
	}
}

